<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>路由元信息</title>
    <script src="https://unpkg.com/vue@2.7.7/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router@3.6.5/dist/vue-router.js"></script>
  </head>
  <body>
    <div id="app1" style="border: 1px dashed red;margin-bottom: 2px;">
      <router-link to="/foo/bar">to /foo/bar</router-link><br />
      <router-link to="/login">to /login</router-link><br />
      <router-view></router-view>
    </div>

    <script type="text/javascript">
      const Foo = {
        template: '<div>Foo:<router-view></router-view></div>'
      }
      
      const Bar = {
        template: '<div>Bar</div>'
      }
      
      const Login = {template: `<div>Login: <br />Username:<input type='text'/><br />Password:<input type='password'/><br /></div>`}
      
      const router = new VueRouter({
        routes: [
          {
            path: '/foo', 
            component: Foo,
            children: [
              {
                path: 'bar',
                component: Bar,
                meta: {requiresAuth: true}
              }
            ]
          },
          {
            path: '/login',
            component: Login
          }
        ]
      })

      /* 首先，我们称呼 routes 配置中的每个路由对象为 路由记录。路由记录可以是嵌套的，因此，当一个路由匹配成功后，他可能匹配多个路由记录
      例如，根据上面的路由配置，/foo/bar 这个 URL 将会匹配父路由记录以及子路由记录。
      一个路由匹配到的所有路由记录会暴露为 $route 对象 (还有在导航守卫中的路由对象) 的 $route.matched 数组。因此，我们需要遍历 $route.matched 来检查路由记录中的 meta 字段。 */
      var loggedIn = false
      router.beforeEach((to, from, next) => {
        if (to.matched.some(record => record.meta.requiresAuth)) {
          // this route requires auth, check if logged in
          // if not, redirect to login page.
          //   if (!auth.loggedIn()) {
          if (loggedIn) {
            next({
              path: '/login',
              query: {redirect: to.fullPath}
            })
          } else{
            next()
          }
        } else {
          next() // 确保一定要调用 next()
        }
      })
      
      new Vue({
        el: '#app1',
        router
      })
      
    </script>
  </body>
</html>